home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
Shareware Grab Bag
/
Shareware Grab Bag.iso
/
090
/
cmln0786.arc
/
GRAFTAL2.LTG
< prev
next >
Wrap
Text File
|
1986-03-31
|
9KB
|
281 lines
Graftals Listing 2
program graftal3;
{ 3-D version of graftals }
{ Program by Ken Birdwell and Steve Estvanik }
const
max_segments = 10000;
type
bytearray = array [0..max_segments] of byte;
codearray = array [0..7,0..20] of byte;
realarray = array [0..10] of real;
rotarray = array[0..2,0..2,0..49] of real;
var
code : codearray;
graftal : bytearray;
x_ang : realarray;
y_ang : realarray;
scale : real;
room_left : boolean;
graftal_len, gen, num_gen, num_ang, ang_mod, i, j : integer;
procedure getcode(var num_var : integer;
var code : codearray;
var x_ang : realarray;
var y_ang : realarray;
var num_ang : integer;
var ang_mod : integer );
var key : string[20];
d, g, num_x_ang, num_y_ang : integer;
begin
write('Enter number of generations: ');
readln(num_gen);
for d := 0 to 7 do
begin
write('Enter key for ',d :1, ': ');
readln(key);
code[d,0] := length(key);
for g := 1 to code[d,0] do
case key[g] of
'0' : code[d,g] := 0;
'1' : code[d,g] := 1;
'[' : code[d,g] := 128;
']' : code[d,g] := 64;
end;
end;
write('Enter number of Y axis angles: ');
readln(num_y_ang);
for g := 1 to num_y_ang do
begin
write ('Enter angle (deg) ', g : 2, ': ');
readln(i);
y_ang[g] := i*3.1415/180;
end;
write('Enter number of X axis angles: ');
readln(num_x_ang);è for g := 1 to num_x_ang do
begin
write ('Enter angle (deg) ', g : 2, ': ');
readln(i);
x_ang[g] := i*3.1415/180;
end;
ang_mod := num_x_ang;
num_ang := num_x_ang * num_y_ang;
end;
function findnext(p : integer;
var orig : bytearray;
var orig_len : integer ) : integer ;
var
found : boolean;
depth : integer;
begin
depth := 0;
found := FALSE;
while (p < orig_len) and not found
begin
p := p + 1;
if (depth = 0) and (orig[p] < 2 ) then
begin
findnext := orig[p];
found := TRUE;
end
else if ((depth = 0) and ((orig[p] and 64) <> 0)) then
begin
findnext := 1;
found := TRUE;
end
else if (orig[p] and 128) <> 0 then
depth := depth + 1
else if (orig[p] and 64) <> 0 then
depth := depth - 1;
end;
if (not found) then
findnext := 1;
end;
procedure add_new(b2, b1, b0 : integer;
var dest : bytearray;
var code : codearray;
var dest_len : integer;
num_ang : integer );
var d, i : integer;
begin
d := b2 * 4 + b1 * 2 + b0;
for i := 1 to code[d, 0] do
begin
dest_len := dest_len + 1;
case code[d,i] of
0..63 : dest[dest_len] := code[d,i];
64 : dest[dest_len] := 64;
128 : dest[dest_len] := 128 + random(num_ang);
end;è end;
end;
procedure generation (var orig : bytearray;
var orig_len : integer;
var code : codearray );
var depth, dest_len,g,a : integer ;
b0,b1,b2 : byte ;
stack : array [0..50] of integer;
dest : bytearray;
begin
depth := 0;
dest_len := 0;
b2 := 1;
b1 := 1;
for g := 1 to orig_len do
begin
if (orig[g] < 2) then
begin
b2 := b1;
b1 := orig[g];
b0 := findnext(g, orig, orig_len);
add_new(b2, b1, b0, dest, code, dest_len, num_ang) ;
end
else if (orig[g] and 128) <> 0 then
begin
dest_len := dest_len + 1;
dest[dest_len] := orig[g];
depth := depth + 1;
stack[depth] := b1;
end
else if (orig[g] and 64) <>0 then
begin
dest_len := dest_len + 1;
dest[dest_len] := orig[g];
b1 := stack[depth];
depth := depth - 1;
end;
end;
for a := 1 to dest_len do
orig[a] := dest[a];
orig_len := dest_len;
end;
procedure print_generation(var graftal : bytearray;
var graftal_len : integer);
var p : integer;
begin
writeln('');
for p := 1 to graftal_len do
begin
if (graftal[p] < 2) then write(graftal[p]:1);
if (graftal[p] and 128) <> 0 then write('[');
if (graftal[p] and 64) <> 0 then write(']');
end;
writeln('');
end;èprocedure calc_rotational_matrix(xangle, yangle : real;
depth : integer;
var rot3 : rotarray );
var sinx, siny : real;
var cosx, cosy : real;
var r_d : real;
begin
sinx := sin(xangle);
cosx := cos(xangle);
siny := sin(yangle);
cosy := cos(yangle);
rot3[0,0,depth] := cosy;
rot3[0,1,depth] := -sinx * -siny;
rot3[0,2,depth] := cosx * -siny;
rot3[1,0,depth] := 0;
rot3[1,1,depth] := cosx;
rot3[1,2,depth] := sinx;
rot3[2,0,depth] := siny;
rot3[2,1,depth] := -sinx * cosy;
rot3[2,2,depth] := cosx * cosy;
end;
procedure calc_deltas(var dx, dy, dz : real;
depth : integer;
rot3 : rotarray );
var x, y, z : real;
d : integer;
begin
dx := 0;
dy := -1;
dz := 0;
for d := depth downto 0 do
begin
x := dx;
y := dy;
z := dz;
dx := x * rot3[0,0,d] + y * rot3[0,1,d] + z * rot3[0,2,d];
dy := x * rot3[1,0,d] + y * rot3[1,1,d] + z * rot3[1,2,d];
dz := x * rot3[2,0,d] + y * rot3[2,1,d] + z * rot3[2,2,d];
end;
end;
procedure draw_generation (var graftal : bytearray;
var graftal_len : integer;
var x_ang : realarray;
var y_ang : realarray;
var ang_mod : integer;
scale : real );
var a_xp, a_yp, a_zp : array[0..50] of real;
a_dx, a_dy, a_dz : array[0..50] of real;
xp, yp, zp : real;
dx, dy, dz : real;
g, depth, ra : integer;
rot3 : rotarray;
begin
graphcolormode;
xp := 140;è yp := 180;
zp := 0;
dx := 0;
dy := -1;
dz := 0;
gotoxy(1,1);
write('Gen ',gen);
depth := 0;
calc_rotational_matrix(0,1.570795,depth,rot3);
for g := 1 to graftal_len do
begin
if (graftal[g] < 2) then
begin
{ drop shadow }
{draw (round(xp)-1, round(yp)-1,
round(xp+dx*scale-1),round(yp+dy*scale-1),0);}
draw (round(xp), round(yp),
round(xp+dx*scale), round(yp+dy*scale),
graftal[g]*2+1);
xp := xp + dx * scale;
yp := yp + dy * scale;
zp := zp + dz * scale;
end;
if (graftal[g] and 128) <> 0 then
begin
a_xp[depth] := xp;
a_yp[depth] := yp;
a_zp[depth] := zp;
a_dx[depth] := dx;
a_dy[depth] := dy;
a_dz[depth] := dz;
depth := depth + 1;
ra := (graftal[g] and $7f);
calc_rotational_matrix(x_ang[(ra mod ang_mod)+1],
y_ang[(ra div ang_mod)+1],
depth,rot3);
calc_deltas(dx,dy,dz,depth,rot3);
end;
if (graftal[g] and 64) <> 0 then
begin
depth := depth - 1;
xp := a_xp[depth];
yp := a_yp[depth];
zp := a_zp[depth];
dx := a_dx[depth];
dy := a_dy[depth];
dz := a_dz[depth];
end;
end;
end;
begin
getcode(num_gen, code, x_ang, y_ang, num_ang, ang_mod);
graftal_len := 1;
graftal[graftal_len] := 1;è scale := 4;
for gen := 1 to num_gen do
begin
generation(graftal, graftal_len, code);
draw_generation(graftal, graftal_len, x_ang, y_ang, ang_mod, scale);
{print_generation(graftal, graftal_len);}
end;
readln(i);
end.